#include "app_message.h"
#include "log.h"
#include "cJSON.h"
#include <string.h>
#include <stdlib.h>
#include "app_common.h"


// 把一个字节数组转换为json串
char * app_message_bytes2json(char * bytes,int bytes_len)
{
    log_debug("正在把一个字节数组转换为json串");
    // 从字节数组中解析出json串
    char conn_type = bytes[0]; // 连接类型
    int id_len = bytes[1];  // id长度
    int data_len = bytes[2]; // 数据长度

    char id[id_len]; // id
    char data[data_len]; // 数据

    // 这一步很关键，因为id和data是char数组，需要手动拷贝
    // 将id和数据拷贝到id和data中
    memcpy(id,bytes+3,id_len);
    memcpy(data,bytes+3+id_len,data_len);

    // 将id和data转换为16进制字符串
    char *id_hex = app_common_bytes2hexstr(id,id_len);
    char *data_hex = app_common_bytes2hexstr(data,data_len);

    // 创建一个cJSON对象
    cJSON *root = cJSON_CreateObject();
    cJSON_AddNumberToObject(root,"type",conn_type);
    cJSON_AddStringToObject(root,"id",id_hex);
    cJSON_AddStringToObject(root,"msg",data_hex);
    char *json_str = cJSON_PrintUnformatted(root);

    cJSON_Delete(root);
    return json_str;
}

// 把一个json串转换为字节数组
int app_message_json2bytes(char * json,char * bytes,int bytes_len)
{
    log_info("json_str = %s",json);
    // 先从json串中解析出type,id,msg
    cJSON *root = cJSON_Parse(json);
    if (root == NULL)
    {
        log_error("json 解析失败！");
        return -1;
    }

    // 获取type,id,msg  json数据
    cJSON * typejson = cJSON_GetObjectItem(root, "type");
    cJSON * idjson = cJSON_GetObjectItem(root, "id");
    cJSON * msgjson = cJSON_GetObjectItem(root, "msg");
    if (typejson == NULL || idjson == NULL || msgjson == NULL)
    {
        log_error("json 解析失败！");
        return -1;
    }
    // 获取type,id,msg  16进制数据
    char type = typejson->valueint;
    char * id_hex = idjson->valuestring;
    char * msg_hex = msgjson->valuestring;
    // 将16进制数据转换为字符串数据
    int id_len = strlen(id_hex) / 2;
    int msg_len = strlen(msg_hex) / 2;
    char id[id_len];
    char msg[msg_len];

    id_len = app_common_hexstr2bytes(id_hex,id);
    msg_len = app_common_hexstr2bytes(msg_hex,msg);

    int data_len = id_len + msg_len + 3;
    if (bytes_len < data_len)
    {
        log_error("缓冲区不足！");
        return -1;
    }

    // 组合完整的字节数据
    bytes[0] = type;
    bytes[1] = id_len;
    bytes[2] = msg_len;
    memcpy(bytes + 3, id, id_len);
    memcpy(bytes + 3 + id_len, msg, msg_len);
    
    return data_len;
}